經過了前幾篇的 CNI 描述後,大家對於 CNI 的使用有了基本認知,一般常說的 CNI 可以包含 IPAM (IP位址管理)也可以不包含 IPAM。因為在某些情況下,CNI Plug-in 的使用和 IPAM Plug-in 的使用是分開為不同的 bin 檔,按照 kubernetes 的規範,我們在使用 CNI 的時候是要區分 CNI 和 IPAM,但是即使寫在⼀起也可以使⽤ CNI ,在 kubernets 啟動 POD 網路的配置流程是 kubelet->docker(pause)->cni->ipam,因此 kubernetes 的網路主要是 CNI 與 IPAM 組成。
整體來說,CNI + IPAM 的實現可以分為兩種:
⼤部分使⽤ kubernetes 的公司,都是使用 kubernetes 經典 CNI,例如: kubernetes +Flannel(VXLAN)、 kubernetes +Calico(IPIP) 等。這種模式下的網路有⼀個共同特點,就是容器網路在 kubernetes cluster 內是隔離的,cluster 外的 Host 主機是無法直接訪問容器 IP 。
之所以會這樣,是因為容器網路是虛擬,這個 kubernets 的虛擬網路,⼤部分上都是借助 routing table + iptables + tunnel 模式來做。
這樣做的優點是網路隔離,部署方便,缺點是流量穿透的情況 kubernetes 內雖然是網路隔離。但其隔離的並不徹底。它的隔離性,一般是由 kube-proxy 元件產生的大量 iptables 規則和 routing table 來實現。這種模式下,iptables 的動態變化,其實依賴 kube-proxy 這個元件,⽽這個元件,其實是用於監聽 kubernetes cluster 的 service + endpoint 資源。我們部署在 cluster 內的 service,訪問某個內部服務,⽤的是基於 DNS 的服務發現機制。
這就帶來了下⾯⼀個問題:
下篇待續...
https://github.com/containernetworking/cni